From 32991237204507d7648023f61dd31fa549c07033 Mon Sep 17 00:00:00 2001 From: robertl Date: Fri, 5 May 2006 14:42:05 +0000 Subject: [PATCH] Andrew Kirmse makes changes allowing use of 'wchar_t' version expat lib. git-svn-id: http://gpsbabel.googlecode.com/svn/trunk@2000 f51c46e8-681c-474f-0cfe-069cfd0219fb --- gpsbabel/cet_util.c | 61 ++++++++++++++++++++++++++++++++++++++++++- gpsbabel/cet_util.h | 14 ++++++++++ gpsbabel/coastexp.c | 17 +++++++++--- gpsbabel/defs.h | 4 +++ gpsbabel/gpx.c | 22 ++++++++++------ gpsbabel/hsa_ndv.c | 9 +++++-- gpsbabel/mkshort.c | 2 +- gpsbabel/navicache.c | 12 +++++++-- gpsbabel/xmlgeneric.c | 19 +++++++++++--- 9 files changed, 139 insertions(+), 21 deletions(-) diff --git a/gpsbabel/cet_util.c b/gpsbabel/cet_util.c index 08d021e54..d5ee5c8f3 100644 --- a/gpsbabel/cet_util.c +++ b/gpsbabel/cet_util.c @@ -114,11 +114,13 @@ cet_str_cp1252_to_utf8(const char *src) * */ #if HAVE_LIBEXPAT -int XMLCALL cet_lib_expat_UnknownEncodingHandler(void *data, const XML_Char *encoding, XML_Encoding *info) +int XMLCALL cet_lib_expat_UnknownEncodingHandler(void *data, const XML_Char *xml_encoding, XML_Encoding *info) { cet_cs_vec_t *cs; int i, c, ucs4_def; + const char *encoding; + encoding = xml_convert_to_char_string(xml_encoding); cs = cet_find_cs_by_name(encoding); if (cs == NULL) return XML_STATUS_ERROR; /* fatal(MYNAME ": Unknown character set \"%s\"!\n", encoding); */ @@ -142,6 +144,7 @@ int XMLCALL cet_lib_expat_UnknownEncodingHandler(void *data, const XML_Char *enc if (global_opts.verbose_status > 0) printf(MYNAME ": XML parser - encoding handler for character set \"%s\" established.\n", encoding); + xml_free_converted_string(encoding); return XML_STATUS_OK; } #endif @@ -1148,3 +1151,59 @@ int cet_fprintf(FILE *stream, const cet_cs_vec_t *src_vec, const char *fmt, ...) return res; } + + +const char *xml_convert_to_char_string(const XML_Char *str) +{ +#ifdef XML_UNICODE + return cet_str_uni_to_utf8(str, wcslen(str)); +#else + return str; +#endif +} + +void xml_free_converted_string(const char *str) +{ +#ifdef XML_UNICODE + xfree(str); +#endif +} + +const char **xml_convert_attrs_to_char_string(const XML_Char **xml_attr) +{ +#ifdef XML_UNICODE + // First count size of array + int size = 0; + int i; + const XML_Char **ptr; + const char **char_attrs; + + if (xml_attr == NULL) + return NULL; + + for (ptr = xml_attr; *ptr != NULL; ++ptr) + ++size; + + // Allocate space + char_attrs = xmalloc((size + 1) * sizeof(char *)); + + // Duplicate strings + for (i = 0; i < size; ++i) + char_attrs[i] = xml_convert_to_char_string(xml_attr[i]); + char_attrs[size] = NULL; + + return char_attrs; +#else + return xml_attr; +#endif +} + +void xml_free_converted_attrs(const char **attr) +{ +#ifdef XML_UNICODE + while (attr != NULL && *attr != NULL) { + xfree(*attr); + ++attr; + } +#endif +} diff --git a/gpsbabel/cet_util.h b/gpsbabel/cet_util.h index 84754ca45..a5ac16247 100644 --- a/gpsbabel/cet_util.h +++ b/gpsbabel/cet_util.h @@ -113,4 +113,18 @@ void cet_convert_deinit(void); void cet_disp_character_set_names(FILE *fout); +/* + * Conversion from XML_Char string to char string. If XML_Char is the + * same as char, these routines do nothing. If XML_Char is a wide + * character, xml_convert_to_char_string converts the string to a + * newly allocated char string, and xml_free_converted_string frees + * it. + */ + +const char *xml_convert_to_char_string(const XML_Char *str); +void xml_free_converted_string(const char *str); + +const char **xml_convert_attrs_to_char_string(const XML_Char **xml_attr); +void xml_free_converted_attrs(const char **attr); + #endif diff --git a/gpsbabel/coastexp.c b/gpsbabel/coastexp.c index 55359c6f2..834663981 100755 --- a/gpsbabel/coastexp.c +++ b/gpsbabel/coastexp.c @@ -131,9 +131,13 @@ ce_read(void) /* Start processing an XML item */ static void -ce_start(void *data, const char *el, const char **attr) +ce_start(void *data, const XML_Char *xml_el, const XML_Char **xml_attr) { + const char *el = xml_convert_to_char_string(xml_el); const char **ap; + const char **attr; + + attr = xml_convert_attrs_to_char_string(xml_attr); strcpy(element, el); if (0 == strcmp(el, "Route")) { inRoute = 1; @@ -165,12 +169,15 @@ ce_start(void *data, const char *el, const char **attr) } } } + xml_free_converted_string(el); + xml_free_converted_attrs(attr); } /* Finish processing an XML item */ static void -ce_end(void *data, const char *el) +ce_end(void *data, const XML_Char *xml_el) { + const char *el = xml_convert_to_char_string(xml_el); if (0 == strcmp(el, "Route")) { if (!doing_rtes) ce_free_route(currentRoute); @@ -178,12 +185,14 @@ ce_end(void *data, const char *el) } else if (0 == strcmp(el, "Mark")) inMark = 0; + xml_free_converted_string(el); } /* Process some XML character data for the current item */ static void -ce_cdata(void *dta, const XML_Char *s, int len) +ce_cdata(void *dta, const XML_Char *xml_s, int len) { + const char *s = xml_convert_to_char_string(xml_s); if (*s != '\n') { char *edatastr; // We buffer up characters in 'cdatastr' until a single is received @@ -294,6 +303,8 @@ ce_cdata(void *dta, const XML_Char *s, int len) // Start building a new string since we are done with this one cdatastr[0] = '\0'; } + + xml_free_converted_string(s); } /* Set up reading the CE input file */ diff --git a/gpsbabel/defs.h b/gpsbabel/defs.h index 9e0d0aed4..2412d3a8e 100644 --- a/gpsbabel/defs.h +++ b/gpsbabel/defs.h @@ -32,6 +32,10 @@ #include "cet_util.h" #include "inifile.h" +// Turn on Unicode in expat? +#ifdef _UNICODE +# define XML_UNICODE +#endif /* * Amazingly, this constant is not specified in the standard... diff --git a/gpsbabel/gpx.c b/gpsbabel/gpx.c index 75828a9a6..348e05f57 100644 --- a/gpsbabel/gpx.c +++ b/gpsbabel/gpx.c @@ -455,13 +455,13 @@ start_something_else(const char *el, const char **attrv) int attr_count = 0; xml_tag *new_tag; fs_xml *fs_gpx; - + if ( !fs_ptr ) { return; } - new_tag = (xml_tag *)xcalloc(sizeof(xml_tag),1); - new_tag->tagname = xstrdup(el); + new_tag = (xml_tag *)xcalloc(sizeof(xml_tag),1); + new_tag->tagname = xstrdup(el); /* count attributes */ while (*avp) { @@ -562,11 +562,13 @@ tag_log_wpt(const char **attrv) } static void -gpx_start(void *data, const char *el, const char **attr) +gpx_start(void *data, const XML_Char *xml_el, const XML_Char **xml_attr) { char *e; char *ep; int passthrough; + const char *el = xml_convert_to_char_string(xml_el); + const char **attr = xml_convert_attrs_to_char_string(xml_attr); vmem_realloc(¤t_tag, strlen(current_tag.mem) + 2 + strlen(el)); e = current_tag.mem; @@ -629,6 +631,8 @@ gpx_start(void *data, const char *el, const char **attr) if (passthrough) { start_something_else(el, attr); } + xml_free_converted_string(el); + xml_free_converted_attrs(attr); } struct @@ -775,14 +779,15 @@ xml_parse_time( const char *cdatastr ) rv = mkgmtime(&tm) - off_sign*off_hr*3600 - off_sign*off_min*60; - xfree(timestr); + xfree(timestr); return rv; } static void -gpx_end(void *data, const char *el) +gpx_end(void *data, const XML_Char *xml_el) { + const char *el = xml_convert_to_char_string(xml_el); char *s = strrchr(current_tag.mem, '/'); float x; char *cdatastrp = cdatastr.mem; @@ -1024,6 +1029,7 @@ gpx_end(void *data, const char *el) } *s = 0; + xml_free_converted_string(el); } #if ! HAVE_LIBEXPAT @@ -1341,7 +1347,7 @@ void free_gpx_extras( xml_tag *tag ) xfree(tag->parentcdata); } if (tag->tagname) { - xfree(tag->tagname); + xfree(tag->tagname); } if (tag->attributes) { ap = tag->attributes; @@ -1657,7 +1663,7 @@ gpx_write(void) fatal(MYNAME ": gpx version number of '%s' not valid.\n", gpx_wversion); } - now = current_time(); + now = current_time(); short_length = atoi(snlen); diff --git a/gpsbabel/hsa_ndv.c b/gpsbabel/hsa_ndv.c index 7b680b3e6..18abb53ee 100644 --- a/gpsbabel/hsa_ndv.c +++ b/gpsbabel/hsa_ndv.c @@ -68,8 +68,10 @@ hsa_ndv_read(void) #else static void -hsa_ndv_start(void *data, const char *el, const char **attr) +hsa_ndv_start(void *data, const XML_Char *xml_el, const XML_Char **attr) { + const char *el = xml_convert_to_char_string(xml_el); + // printf("<%s>\n", el); if (strcmp(el, "Export") == 0) {//should only be one @@ -90,11 +92,13 @@ hsa_ndv_start(void *data, const char *el, const char **attr) } //reset data :) memset(cdatastr,0, MY_CBUF); + xml_free_converted_string(el); } static void -hsa_ndv_end(void *data, const char *el) +hsa_ndv_end(void *data, const XML_Char *xml_el) { + const char *el = xml_convert_to_char_string(xml_el); if (in_Route) { if (strcmp(el, "Version") == 0) @@ -191,6 +195,7 @@ hsa_ndv_end(void *data, const char *el) { in_ChartWork--; } + xml_free_converted_string(el); } static void diff --git a/gpsbabel/mkshort.c b/gpsbabel/mkshort.c index 5949c0d75..daa751434 100644 --- a/gpsbabel/mkshort.c +++ b/gpsbabel/mkshort.c @@ -28,7 +28,7 @@ static const char vowels[] = "aeiouAEIOU"; #define DEFAULT_TARGET_LEN 8 -#define DEFAULT_BADCHARS "\"$.,'!-" +static const char *DEFAULT_BADCHARS = "\"$.,'!-"; /* * Hash table tunings. The reality is that our hash doesn't have to be diff --git a/gpsbabel/navicache.c b/gpsbabel/navicache.c index 8a2fe8a81..de50e7f8a 100644 --- a/gpsbabel/navicache.c +++ b/gpsbabel/navicache.c @@ -108,8 +108,13 @@ nc_mkcont(const char *t) } static void -nav_start(void *data, const char *el, const char **attr) +nav_start(void *data, const XML_Char *xml_el, const XML_Char **xml_attr) { + const char *el; + const char **attr; + + el = xml_convert_to_char_string(xml_el); + attr = xml_convert_attrs_to_char_string(xml_attr); if (0 == strcmp(el, "CacheDetails")) { const char **ap; wpt_tmp = waypt_new(); @@ -192,10 +197,13 @@ nav_start(void *data, const char *el, const char **attr) } waypt_add(wpt_tmp); } + + xml_free_converted_attrs(attr); + xml_free_converted_string(el); } static void -nav_end(void *data, const char *el) +nav_end(void *data, const XML_Char *el) { } diff --git a/gpsbabel/xmlgeneric.c b/gpsbabel/xmlgeneric.c index a07e06d6a..e12b088fc 100644 --- a/gpsbabel/xmlgeneric.c +++ b/gpsbabel/xmlgeneric.c @@ -183,11 +183,16 @@ xml_consider_ignoring(const char *t) static void -xml_start(void *data, const char *el, const char **attr) +xml_start(void *data, const XML_Char *xml_el, const XML_Char **xml_attr) { char *e; char *ep; xg_callback *cb; + const char *el; + const char **attrs; + + el = xml_convert_to_char_string(xml_el); + attrs = xml_convert_attrs_to_char_string(xml_attr); if (xml_consider_ignoring(el)) return; @@ -203,26 +208,31 @@ xml_start(void *data, const char *el, const char **attr) cb = xml_tbl_lookup(e, cb_start); if (cb) { - (*cb)(NULL, attr); + (*cb)(NULL, attrs); } + xml_free_converted_string(el); + xml_free_converted_attrs(attrs); } #if HAVE_LIBEXPAT static void -xml_cdata(void *dta, const XML_Char *s, int len) +xml_cdata(void *dta, const XML_Char *xml_s, int len) { char *estr; + const char *s = xml_convert_to_char_string(xml_s); vmem_realloc(&cdatastr, 1 + len + strlen(cdatastr.mem)); estr = (char *) cdatastr.mem + strlen(cdatastr.mem); memcpy(estr, s, len); estr[len] = 0; + xml_free_converted_string(s); } static void -xml_end(void *data, const char *el) +xml_end(void *data, const XML_Char *xml_el) { char *s = strrchr(current_tag.mem, '/'); + const char *el = xml_convert_to_char_string(xml_el); xg_callback *cb; if (xml_consider_ignoring(el)) @@ -241,6 +251,7 @@ xml_end(void *data, const char *el) (*cb)(el, NULL); } *s = 0; + xml_free_converted_string(el); } void xml_read(void) -- 2.30.2